package com.guang.readandwritelock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author lg
 * @Description 在写锁的情况下，可以获取得到读锁  称之为锁降级
 *
 *              相对于同一个线程来说，读写锁是支持重入的！不同的线程不支持
 *
 *              可能存在的情况：
 *
 *                      t1 w  t2 w
 *
 *                   写锁和写锁之间是互斥的，所以在某一个时刻，只有一个写锁成功，假如说是t1锁
 *                   那么获取得到了写锁之后，读锁就不能够被其他线程持有了。只能是本线程来持有，所以是可以的
 *
 *          所以读写锁可以降级，但是不能够进行升级
 *
 * @date 2022/10/18 17:05
 */
public class ReadWriteLockDemoTwo {
    private final static Logger logger = LoggerFactory.getLogger(ReadWriteLockDemoTwo.class);
    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    public static void main(String[] args) {

        new Thread(()->{
            reentrantReadWriteLock.writeLock().lock();
            logger.info("获取得到了写锁");
            reentrantReadWriteLock.readLock().lock();
            logger.info("在获取得到写锁的情况下来获取得到读锁");
            reentrantReadWriteLock.readLock().unlock();
            logger.info("在获取得到写锁的情况下来释放读锁");
            reentrantReadWriteLock.writeLock().unlock();
            logger.info("释放写锁");

        }).start();
    }
}
